﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BibliotecasDeBase.AccesoADatos;
using System.Collections;
using System.Data;
using System.Web.SessionState;

/// <summary>
/// Descripción breve de UsuarioServices
/// </summary>
public class UsuarioServices
{
    Ado ado;

    public UsuarioServices()
    {
        ado = new Ado();
    }

    ~UsuarioServices()
    {
        ado = null;
    }
    /// <summary>
    /// Agrega un nuevo Usuario en la base de datos.
    /// </summary>
    /// <param name="Nombre"></param>
    /// <param name="Apellido"></param>
    /// <param name="TipoUsuarioId"></param>
    /// <param name="Mail"></param>
    /// <param name="Pass"></param>
    /// <returns></returns>
    public int AgregarUsuario(string Nombre, string Apellido, int TipoUsuarioId, string Mail, string Pass)
    {
        ArrayList ParametrosMail = new ArrayList();
        ParametrosMail.Add(Mail);
        ado.EjecutarStoredProcedure(false, "Usuario_ExisteMail", ParametrosMail);
        DataSet ds = ado.DevolverDatos();
        //Valido que el mail no sea repetido y que no tenga datos obligatorios vacios
        if (ds.Tables[0].Rows.Count > 0) //Existe el mail en la DB
            return -1;
        else if (TipoUsuarioId != 0 && TipoUsuarioId != 0)
        {
            ArrayList ParametrosUsuario = new ArrayList();
            ParametrosUsuario.Add(Nombre);
            ParametrosUsuario.Add(Apellido);
            ParametrosUsuario.Add(TipoUsuarioId);
            ParametrosUsuario.Add(Mail);
            ParametrosUsuario.Add(Pass);
            ado.EjecutarStoredProcedure(false, "Usuario_InsertarUsuario", ParametrosUsuario);
            ado.EjecutarStoredProcedure(false, "Usuario_ExisteMail", ParametrosMail);
            return SaveIdUsuarioLogueado();
        }
        return 0;
    }

    public int LogInFacebook(string Nombre, string Apellido, string Mail, string IdFacebook)
    {
        ArrayList Parametros = new ArrayList();
        Parametros.Add(IdFacebook);
        ado.EjecutarStoredProcedure(false, "Usuario_GetIdUsuarioFromFacebookId", Parametros);
        int IdUsuario = SaveIdUsuarioLogueado();
        if (IdUsuario != -1)
            return IdUsuario;
        else
        {
            ArrayList ParametrosUsuarioFaceBook = new ArrayList();
            ParametrosUsuarioFaceBook.Add(Nombre);
            ParametrosUsuarioFaceBook.Add(Apellido);
            ParametrosUsuarioFaceBook.Add(Mail);
            ParametrosUsuarioFaceBook.Add(IdFacebook);
            ado.EjecutarStoredProcedure(false, "Usuario_InsertarUsuarioDeFacebook", ParametrosUsuarioFaceBook);
            ado.EjecutarStoredProcedure(false, "Usuario_GetIdUsuarioFromFacebookId", Parametros);
            return SaveIdUsuarioLogueado();
        }
    }

    public int LogInGMail(string Nombre, string Apellido, string Mail, string IdGMail)
    {
        
        ArrayList Parametros = new ArrayList();
        Parametros.Add(IdGMail);
        ado.EjecutarStoredProcedure(false, "Usuario_GetIdUsuarioFromGMailId", Parametros);
        int IdUsuario = SaveIdUsuarioLogueado();
        if (IdUsuario != -1)
            return IdUsuario;
        else
        {
            ArrayList ParametrosUsuarioGMail = new ArrayList();
            ParametrosUsuarioGMail.Add(Nombre);
            ParametrosUsuarioGMail.Add(Apellido);
            ParametrosUsuarioGMail.Add(Mail);
            ParametrosUsuarioGMail.Add(IdGMail);
            ado.EjecutarStoredProcedure(false, "Usuario_InsertarUsuarioDeGMail", ParametrosUsuarioGMail);
            ado.EjecutarStoredProcedure(false, "Usuario_GetIdUsuarioFromGMailId", Parametros);
            return SaveIdUsuarioLogueado();
        }
    }



    public DataSet BuscarUsuarioNoSeguido(int idUsuario, string DatosUsuario, bool BuscarArtistas, bool BuscarEspectadores)
    {
        ArrayList ParametrosBuscar = new ArrayList();
        ParametrosBuscar.Add(idUsuario);
        ParametrosBuscar.Add(DatosUsuario);
        ParametrosBuscar.Add(BuscarArtistas);
        ParametrosBuscar.Add(BuscarEspectadores);
        ado.EjecutarStoredProcedure(false, "Usuario_GetUsuariosNoSigue", ParametrosBuscar);
        return ado.DevolverDatos();
    }

    public bool NewContacto(int idUsuarioSeguidor, int idUsuarioSeguido)
    {
        ArrayList ParametrosContacto = new ArrayList();
        ParametrosContacto.Add(idUsuarioSeguidor);
        ParametrosContacto.Add(idUsuarioSeguido);
        return ado.EjecutarStoredProcedure(false, "Contacto_NewContacto", ParametrosContacto);
    }

    internal Usuario BuscarUsuario(int idUsuario)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idUsuario);
        ado.EjecutarStoredProcedure(false, "Usuario_BucarUsuarioPorId", parametros);
        DataRow row = ado.DevolverDataTable().Rows[0];
        TipoUsuarioServices tipoServices = new TipoUsuarioServices();
        TipoUsuario tipo = tipoServices.buscarTipoUsuarioPorDescripcion(Convert.ToInt32(row["tipo_usuario_id"]));
        
        if (tipo.Descripcion.Equals(TwitterAPI.TIPO_USUARIO_TWITTER))
        {
            return CrearUsuarioTwitterDesdeRow(row);
        }

        return CrearUsuarioDesdeRow(row);
        
        
    }

    private Usuario CrearUsuarioDesdeRow(DataRow row)
    {
        Usuario usuario = new Usuario();
        usuario.Apellido = row["apellido"].ToString();
        usuario.Nombre = row["nombre"].ToString();
        usuario.Id_usuario = Convert.ToInt32(row["id_usuario"]);
        usuario.Mail = row["mail"].ToString();
        usuario.Pass = row["pass"].ToString();
        usuario.UrlFotoPerfil = row["url_foto_perfil"].ToString();
        usuario.Tipo_usuario_id = Convert.ToInt32(row["tipo_usuario_id"]);
        
        return usuario;
    }

    public int LogIn(string Mail, string Pass)
    {
        ArrayList ParametrosLogin = new ArrayList();
        ParametrosLogin.Add(Mail);
        ParametrosLogin.Add(Pass);
        ado.EjecutarStoredProcedure(false, "Usuario_LogIn", ParametrosLogin);
        return SaveIdUsuarioLogueado();
    }

    private int SaveIdUsuarioLogueado()
    {
        DataSet ds = ado.DevolverDatos();
        if (ds.Tables[0].Rows.Count > 0)
        {
            int IdUsuario = Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
            HttpContext.Current.Session["IdUsuario"] = IdUsuario;
            return IdUsuario;
        }
        else
            return -1;
    }
    /// <summary>
    /// Obtiene el nombre de un usuario desde la base de datos
    /// </summary>
    /// <param name="IdUsuario"></param>
    /// <returns></returns>
    public string GetNombreUsuario(int IdUsuario)
    {
        ArrayList Parametros = new ArrayList();
        Parametros.Add(IdUsuario);
        ado.EjecutarStoredProcedure(false, "Usuario_GetNombre", Parametros);
        DataSet ds = ado.DevolverDatos();
        if (ds.Tables[0].Rows.Count > 0)
            return ds.Tables[0].Rows[0][0].ToString();
        else
            return "";
    }
    /// <summary>
    /// Obtiene los usuarios que el usuario pasado por parametro sigue
    /// </summary>
    /// <param name="idUsuario">id del usuario seguidor</param>
    /// <returns>Lista de usuarios seguidos</returns>
    internal List<Usuario> BuscarUsuariosSeguidos(int idUsuario)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idUsuario);
        ado.EjecutarStoredProcedure(false, "Usuario_BuscarContactos", parametros);
        DataTable table = ado.DevolverDataTable();
        List<Usuario> usuarios = new List<Usuario>();
        foreach (DataRow row in table.Rows)
        {
            usuarios.Add(CrearUsuarioDesdeRow(row));
        }

        return usuarios;
    }

    /// <summary>
    /// Agrega un nuevo usuario de Twitter en la base de datos.
    /// </summary>
    /// <param name="usuario">Un usuario de Twitter</param>
    public void AgregarUsuarioTwitter(Usuario usuario)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(usuario.Nombre);
        parametros.Add(usuario.Id_twitter);
        parametros.Add(usuario.Id_twitter_secret);
        parametros.Add(usuario.UrlFotoPerfil);
        parametros.Add(usuario.TwitterIdentification);
        ado.EjecutarStoredProcedure(false, "Usuario_InsertarUsuarioTwitter", parametros);
    }

    /// <summary>
    /// Busca en la base de datos un Usuario de Twitter
    /// </summary>
    /// <param name="accessKey"></param>
    /// <param name="accessSecret"></param>
    /// <returns></returns>
    public Usuario BuscarUsuarioTwitter(string accessKey, string accessSecret)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(accessKey);
        parametros.Add(accessSecret);
        ado.EjecutarStoredProcedure(false, "Usuario_ObtenerUsuarioTwitter", parametros);
        DataTable table = ado.DevolverDataTable();
        if (table.Rows.Count == 0) {
            throw new UsuarioTwitterInexistenteException(accessKey, accessSecret);
        }
        return CrearUsuarioTwitterDesdeRow(table.Rows[0]);
    }
    
    private Usuario CrearUsuarioTwitterDesdeRow(DataRow row)
    {
        Usuario usuario = new Usuario();
        usuario.Nombre = row["nombre"].ToString();
        usuario.Id_usuario = Convert.ToInt32(row["id_usuario"]);
        usuario.Id_twitter = row["id_twitter"].ToString();
        usuario.Id_twitter_secret = row["id_twitter_secret"].ToString();
        usuario.Tipo_usuario_id = Convert.ToInt32(row["tipo_usuario_id"]);
        usuario.UrlFotoPerfil = row["url_foto_perfil"].ToString();
        usuario.TwitterIdentification = Convert.ToDecimal(row["twitterIdentification"]);
        usuario.Apellido = "";
        return usuario;
    }

    /// <summary>
    /// Guarda la URL de la foto de perfil en la base de datos
    /// </summary>
    /// <param name="IdUsuario"></param>
    /// <param name="urlPhoto"></param>
    public void SaveUrlPhotoPerfil(int IdUsuario, string urlPhoto)
    {
        ArrayList Parametros = new ArrayList();
        Parametros.Add(IdUsuario);
        Parametros.Add(urlPhoto);
        ado.EjecutarStoredProcedure(false, "Usuario_SaveUrlPhotoPerfil", Parametros);
    }
    /// <summary>
    /// Guardar la URL de una foto en la base de datos
    /// </summary>
    /// <param name="IdUsuario"></param>
    /// <param name="urlPhoto"></param>
    /// <param name="descripcion"></param>
    public void SavePhoto(int IdUsuario, string urlPhoto, string descripcion)
    {
        ArrayList Parametros = new ArrayList();
        Parametros.Add(urlPhoto);
        Parametros.Add(IdUsuario);
        Parametros.Add(descripcion);
        ado.EjecutarStoredProcedure(false, "Foto_InsertarFoto", Parametros);
    }


    public void ActualizarUsuarioTwitter(Usuario usuario)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(usuario.Id_usuario);
        parametros.Add(usuario.UrlFotoPerfil);
        ado.EjecutarStoredProcedure(false, "Usuario_ActualizarUsuarioTwitter", parametros);
    }

    public List<Usuario> TraerUsuariosBancanPost(int idPost)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idPost);
        ado.EjecutarStoredProcedure(false, "Bancar_TraerBancadoresPost", parametros);
        DataTable table = ado.DevolverDataTable();
        List<Usuario> usuarios = new List<Usuario>();
        foreach (DataRow row in table.Rows)
        {
            usuarios.Add(CrearUsuarioDesdeRow(row));
        }

        return usuarios;
    }

    public List<Usuario> TraerUsuariosBancanFoto(int idFoto)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idFoto);
        ado.EjecutarStoredProcedure(false, "Bancar_TraerBancadoresFoto", parametros);
        DataTable table = ado.DevolverDataTable();
        List<Usuario> usuarios = new List<Usuario>();
        foreach (DataRow row in table.Rows)
        {
            usuarios.Add(CrearUsuarioDesdeRow(row));
        }

        return usuarios;
    }

    public List<Usuario> TraerUsuariosBancanComentario(int idComentario)
    {
        ArrayList parametros = new ArrayList();
        parametros.Add(idComentario);
        ado.EjecutarStoredProcedure(false, "Bancar_TraerBancadoresComentario", parametros);
        DataTable table = ado.DevolverDataTable();
        List<Usuario> usuarios = new List<Usuario>();
        foreach (DataRow row in table.Rows)
        {
            usuarios.Add(CrearUsuarioDesdeRow(row));
        }

        return usuarios;
    }
}